#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
  /* code */
  int b1 = 0b1101;
  int b2 = 0b11;

  /*
  低位对齐，高位补0
  1101
  0011 ｜
  --------
  1111
  */
  int b3 = b1 | b2; // 1111
  int b4 = b1 & b2; // 0b1
  // 左移 低位补 0
                    // 
  int b5 = b1 << 3; // 1101000
  int b6 = b5 >> 2; //   11010

  /*
  0x33 -> 0b00110011
  把每一位十六进制数，变成 4 个二进制位表达的形式，然后连起来 
  0x55 -> 0b01010101
  */

  /*
  在 C++ 里，专门用来保存整数的类型？它们最大的区别是各自表达的数值范围不同。
  char        - 1 个字节 - 8 bits
  short       - 2 个字节 - 16 bits
  int         - 4 个字节 - 32 bits
  long        - 8 个字节 - 64 bits
  long long   - 16 个字节 - 128 bits

  计算机里如何表达负数？
  5  - 0b0101
  -5 - 0b1011
  11

  7  - 0b0111
  -7 - 0b1001
   9 - 
  把 5 的二进制取反（原来的 1->0，原来的 0 ->1）;
  把取反的结果 + 1

  -1 - 0b1111    1 - 0b0001
  -2 - 0b1110    2 - 0b0010
  -3 - 0b1101    3 - 0b0011
  -4 - 0b1100    4 - 0b0100
  -5 - 0b1011    5 - 0b0101
  -6 - 0b1010    6 - 0b0110
  -7 - 0b1001    7 - 0b0111
  -----------
   8 - 0b01000 -> 0b10111 + 1
   0b10111
   0b00001 +
   ---------
     11000
  -8 0b11000
  -9
  可以用 4 个二进制位表达么？
  
  所有有歧义的二进制数字，它们有什么共同的特点？
  正数的二进制，它的最高位都是 0
  负数的二进制，它的最高位都是 1
  当一个二进制数它表达的有可能是正数、也可能是负数的时候，它的最高位是有特殊含义的。

  对于一个有符号数来说，它的最高位叫做符号位。
  */

  // unsigned 区分同一个二进制数的解析方法
  // unsigned 无符号数
  unsigned short x;
  x = (x | x << 2) & 0x33;
  cout << x << endl;

  
  return 0;
}
